﻿#ifndef AUDIO_PLAYER_H
#define AUDIO_PLAYER_H


#include <windows.h>
#include <mmsystem.h>
#include <string>
#include <atomic>
#include <thread> 
#include <set>
#include <memory>


#include "audio_player_utils.h" //工具包

#pragma comment(lib, "winmm.lib")



class AudioPlayer {
    
public:
    AudioPlayer();
    ~AudioPlayer();

    // 初始化
    bool init(const std::string& filePath, const std::string& name = "", bool loop = true);

    // 播放控制方法
    bool play(); //开始播放
    bool pause(); //暂停
    bool restart(); //重新开始
    bool setLoop(bool loop); //设置循环播放

    // 音量控制方法
    bool setVolume(float volume); //设置音量 0-100
    float getVolume() const;      //获取音量

    // 淡入淡出控制方法
    bool fadeIn(float durationSeconds);  //淡入
    bool fadeOut(float durationSeconds); //淡出

    // 状态查询方法
    bool isInitialized() const; //检查是否成功初始化
    bool isPlaying(); //检查是否正在播放
    bool isLooping() const; //检查是否循环播放
    float getDuration() const;  //获取音频总时长
    float getPlayingOffset() const;  //获取当前播放位置

    static bool includeID(const std::string id); //检查id是否已经存在


private:    
    
    // 音频资源和状态
    bool initialized; //是否初始化
    std::string name; //音频名字
    std::wstring nameW; //音频名字, 宽字符
    std::string filePath; //文件路径
    std::atomic<float> volume; //音量范围 0 ~ 100
    std::atomic<bool> isLooping_;
    std::atomic<bool> isPlaying_;
    std::atomic<bool> isFading;
    //检查是否播放完毕
    void checkPlayCompleted();

    // 淡入淡出实现
    bool fade(float startVolume, float targetVolume, float durationSeconds);

    // 音频名称去重
    static std::set<std::string> nameSet;
    static long long int defaultNameCount;

};


#endif